#include <iostream>
#include <signal.h>
#include <stdlib.h>
#include <vector>
#include <functional>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>

using namespace std;
size_t count = 0;

typedef function<void()> fun;

vector<fun> callbacks;

void handler(int s)
{
    cout << "获得信号" << s << endl;
    sleep(1);
    // exit(1);
}
int main()
{
    signal(SIGSEGV, handler);

    int *p = nullptr;
    *p = 1;
    return 0;
}

// int main()
// {
//     signal(SIGFPE, handler);
//     int a = 10;
//     a /= 0;
// //
//     while (true)
//         sleep(1);
// //
//     return 0;
// }

void showCont()
{
    // cout << "捕捉到一个信号: " << s << " Pid: " << getpid() << endl;
    cout << "count:" << count << endl;
}

void showLog()
{
    cout << "日志功能" << endl;
}

void logUser()
{
    if (fork() == 0)
    {
        execl("/usr/bin/who", "who", nullptr);
        exit(1);
    }
    wait(nullptr);
}

void catchSign(int s)
{
    for (auto &f : callbacks)
    {
        f();
    }
    alarm(1);
}

// int main(int argc, char *argv[])
// {
//     alarm(1);
//     signal(SIGALRM, catchSign);
//
//     callbacks.push_back(showCont);
//     callbacks.push_back(showLog);
//     callbacks.push_back(logUser);
//     while (true)
//         count++;
//
//     return 0;
// }

// int main()
// {
//     // int i = 3;
//     // // signal(2, catchSign);
//     // signal(SIGINT, catchSign);
//     // signal(SIGQUIT, catchSign);
//     // // 对特定的信号处理
//     // // signal 如果没有SIGINT产生，catchSign是永远不会被调用的
//
//     // signal(SIGQUIT, catchSign);
//
//     // int a = 100;
//     // a /= 0;
//
//     // // while (i--)
//     // while (true)
//     // {
//     //     cout << "处理信号中,Pid: " << getpid() << endl;
//     //     sleep(1);
//     // }
//
//     pid_t id = fork();
//     if (!id)
//     {
//         sleep(1);
//         int a = 100;
//         a /= 0;
//         exit(0);
//     }
//
//     int status = 0;
//     waitpid(id, &status, 0);
//     cout << "父进程：" << getpid() << "子进程：" << id << "exit sign:" <<\
//      (status & 0x7F) << "is core:" << ((status >> 7) & 0x1) << endl;
//
//     return 0;
// }

static void Usage(string s)
{
    cout << "Usage:\r\n\t" << s << " signumer process id" << endl;
}

int masdfesin(int argc, char *argv[])
{
    // // kill -num pid  三个
    // if (argc != 3) // 参数的数目不为3
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // int signum = atoi(argv[1]); // 信号编号
    // int pid = atoi(argv[2]);    // 进程pid

    // kill(pid, signum);

    // cout << "run start" << endl;
    // sleep(2);
    // raise(8);
    // cout << "u cant't see me" << endl;

    // abort(); // 相当于raise(6)或kill(process_pid, 6)

    alarm(1); // 设定触发后，就自动移除了
    // int count = 0; // 验证1s内，会进行多少次count++
    //  1、为啥只有几万次？
    //  （1）网络发送 + cout = IO

    // 2、如果进行单纯的算力呢？
    signal(SIGALRM, catchSign);
    while (true)
        count++;

    return 0;
}